package com.moonbird.springboot.service;

import com.moonbird.springboot.DTO.Result;
import com.moonbird.springboot.Utils.SpeedTranscription.iflytek.AudioTranscripitionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;

/**
 * @author hpl
 */
@Service
@Slf4j
public class AudioService {

    // 支持的音频文件格式
    private static final List<String> SUPPORTED_AUDIO_FORMATS = Arrays.asList("audio/wav", "audio/pcm", "audio/mpeg");

    public Result<String> transcribeAudio(MultipartFile file) throws IOException, InterruptedException {
        System.out.println("===========AudioService.transcribeAudio()==========");
        System.out.println("抵达AudioService.transcribeAudio()方法");
        // 获取文件的MIME类型
        System.out.println("获取文件类型");
        String contentType = file.getContentType();
        boolean isAudioFile = SUPPORTED_AUDIO_FORMATS.contains(contentType);

        // 判断是否是支持的音频文件格式
        if (!isAudioFile) {
            return Result.fail("只接收wav/pcm/mp3等格式的音频文件");
        }

        System.out.println("转换file文件");
        // 将 MultipartFile 转换为 File
        File tempFile = convertMultipartFileToFile(file);

        System.out.println("开始转录");
        // 调用转录工具类处理文件
        String result = AudioTranscripitionUtil.deal(tempFile);

        // 删除临时文件
        System.out.println(tempFile.delete());
        return Result.success(result);
    }

    private File convertMultipartFileToFile(MultipartFile file) throws IOException {
        // 获取文件的原始名称
        String originalFilename = file.getOriginalFilename();

        // 构建文件路径
        String filePath = System.getProperty("java.io.tmpdir") + "/" + originalFilename;
        System.out.println("文件路径：" + filePath);

        // 创建文件对象
        File convFile = new File(filePath);
        // 确保文件所在的目录存在
        File parentDir = convFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            // 如果父目录不存在，则创建它
            boolean directoryCreated = parentDir.mkdirs();
            if (!directoryCreated) {
                throw new IOException("Failed to create directory: " + parentDir.getAbsolutePath());
            }
        }
        // 将 MultipartFile 写入到 File
        try (FileOutputStream fos = new FileOutputStream(convFile)) {
            fos.write(file.getBytes());
        }

        return convFile;
    }


    public Result<String> toTTS(String text, String vcn) {
        try {
            String filePath = com.iflytek.WebTtsWs.toTTS(text, vcn);
            System.out.println("MP3 文件生成成功：" + filePath);

            // 确保文件路径正确
            File file = new File(filePath);

            // 延迟读取文件，确保文件写入完成
            Thread.sleep(7000);

            // 判断文件是否存在且不为空
            if (file.exists() && file.length() > 0) {
                System.out.println("文件存在且不为空：" + file.getAbsolutePath());
            } else {
                System.out.println("文件不存在或为空：" + file.getAbsolutePath());
            }

            // 获取文件大小
            System.out.println("MP3 文件大小：" + file.length() / 1024 + "KB");

            // 读取MP3文件并转换为Base64字符串
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] fileBytes = new byte[(int) file.length()];
            fileInputStream.read(fileBytes);
            fileInputStream.close();

            // 转换为Base64字符串
            String base64String = Base64.getEncoder().encodeToString(fileBytes);
            if (file.exists()) {
                if (file.delete()) {
                    System.out.println("音频文件已删除: " + file);
                } else {
                    System.out.println("无法删除音频文件: " + file);
                }
            } else {
                System.out.println("图片音频不存在: " + file);
            }
            return Result.success(base64String);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.fail("生成失败");
        }
    }
}
